using System;

namespace Td.Additional.Log
{
    /// <summary>
    /// Interface for classes with logging methods
    /// </summary>
    public interface ILog
    {
        /// <summary>
        /// Gets or sets the log level.
        /// </summary>
        /// <value>The log level.</value>
        LogLevel LogLevel { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether full qualified method name should be logged.
        /// </summary>
        /// <value>
        /// 	<c>true</c> if full qualified method name should be logged; otherwise, <c>false</c>.
        /// </value>
        Boolean LogFullQualifiedMethodName { get; set; }

        /// <summary>
        /// Log the specified message with debug level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Debug(string message);

        /// <summary>
        /// Log the specified message with debug level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Debug(string message, params object[] args);

        /// <summary>
        /// Log the specified message with info level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Info(string message);

        /// <summary>
        /// Log the specified message with info level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Info(string message, params object[] args);

        /// <summary>
        /// Log the specified message with warn level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Warn(string message);

        /// <summary>
        /// Log the specified message with warn level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Warn(string message, params object[] args);

        /// <summary>
        /// Log the specified message with error level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Error(string message);

        /// <summary>
        /// Log the specified message with error level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Error(string message, params object[] args);

        /// <summary>
        /// Log the specified message with critical level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Critical(string message);

        /// <summary>
        /// Log the specified message with critical level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Critical(string message, params object[] args);

        /// <summary>
        /// Log the specified message with fatal level.
        /// </summary>
        /// <param name="message">The message.</param>
        void Fatal(string message);

        /// <summary>
        /// Log the specified message with fatal level.
        /// </summary>
        /// <param name="message">The message.</param>
        /// <param name="args">The arguments.</param>
        void Fatal(string message, params object[] args);
    }
}